// // using namespace std;

// /*实用工具类的实现
//     1. 获取系统时间
//     2. 判断文件是否存在
//     3. 获取文件所在路径
//     4. 创建目录
// */

// ifndef只是让别的程序在使用这个头文件的时候，这个头文件最终都只会在编译器中生成一份
// 注意：__M_ 和 _H__ 这两个是不变的，这两个中间的字母应该对应当前hpp文件的名称的大写形式
#ifndef __M_UTIL_H__
#define __M_UTIL_H__

#include <iostream>
#include <string>
#include <ctime>
#include <unistd.h>
#include <sys/stat.h>

namespace log_sys{
    namespace util{
        class Date{
            public:
                static time_t now() {
                    return (size_t)time(nullptr);
                }
        };
        class File{
            public:
                // 判断 pathname 这个目录名是否存已经在当前系统重存在
                // 所谓的路径名, 可以是 ./，也可以是 ./目录一，也可以是./目录一/目录二
                static bool exists(const std::string& pathname)
                {
                    // access接口只在linux操作系统重可用
                    // return (access(pathname.c_str(), F_OK == 0));
                    // stat 既是一个类，也是一个函数名称，在windows和linux中都可以使用
                    struct stat st;
                    if (stat(pathname.c_str(), &st) < 0)
                    {
                        return false;
                    }
                    return true;
                }

                // 找到当前文件所在路径，也就是只返回pathname中最后一个 / 或 \ 前的所有路径
                // 这里的pathname形如 ./目录一/目录二/文件名
                static std::string path( const std::string& pathname)
                {
                    // 查找最后一个 / 或 \ 中的任意一个字符
                    size_t pos = pathname.find_last_of("/\\");
                    if (pos == std::string::npos)
                    {
                        return ".";
                    }
                    return pathname.substr(0, pos + 1);
                }

                // 按照pathname所给的路径一层层的创建 目录，这里的pathname形如 ./目录一/目录二
                // 所谓的一层层就是 创建./目录一，再创建 ./目录一/目录二
                static void createDirectory(const std::string &pathname)
                {
                    size_t pos = 0, prev = 0;
                    while (prev < pathname.size())
                    {
                        pos = pathname.find_first_of("/\\", prev);
                        if (prev == std::string::npos)
                        {
                            mkdir(pathname.c_str(), 0777);
                            return;
                        }
                        std::string parentdir = pathname.substr(0, pos + 1);
                        if (!exists(parentdir))
                        {
                            mkdir(parentdir.c_str(), 0777);
                        }
                        prev = pos + 1;
                    }
                    
                }
        };
    }
}

#endif

// #ifndef __M_UTIL_H__
// #define __M_UTIL_H__

// #include <iostream>
// #include <fstream>
// #include <sstream>
// #include <string>
// #include <ctime>
// #include <cassert>
// #include <sys/stat.h>

// namespace bitlog{
//     namespace util{
//         class date {
//             public:
//                 static size_t now() { return (size_t)time(nullptr); }
//         };
//         class file {
//             public:
//                 static bool exists(const std::string &name) {
//                     struct stat st;
//                     return stat(name.c_str(), &st) == 0;
//                 }
//                 static std::string path(const std::string &name) {
//                     if (name.empty()) return ".";
//                     size_t pos = name.find_last_of("/\\");
//                     if (pos == std::string::npos) return ".";
//                     return name.substr(0, pos + 1);
//                 }
//                 static void createdirectory(const std::string &path) { 
//                     if (path.empty()) return ;
//                     if (exists(path)) return ;
//                     size_t pos, idx = 0;
//                     while(idx < path.size()) {
//                         pos = path.find_first_of("/\\", idx);
//                         if (pos == std::string::npos) {
//                             mkdir(path.c_str(), 0755);
//                             return;
//                         }
//                         if (pos == idx) {idx = pos + 1; continue;}
//                         std::string subdir = path.substr(0, pos);
//                         if (subdir == "." || subdir == "..") {idx = pos + 1; continue;}
//                         if (exists(subdir)) {idx = pos + 1; continue;}
//                         mkdir(subdir.c_str(), 0755);
//                         idx = pos + 1;
//                     }
//                 }
//         };
//     }
// }
// #endif
